package com.bitoon.basketdudes.web.admin;

import com.bitoon.basketdudes.web.BaseAction;
import com.bitoon.basketdudes.web.jpa.InvitacionPeticion;

import java.util.*;
import javax.persistence.*;
import org.apache.log4j.Logger;

public class ListaPeticiones extends BaseAction {
    
    private List<InvitacionPeticion> datos;
    private int pagina = -1;
    private int paginas;
    private int primeraPagina;
    private int ultimaPagina;
    private static int MAXIMO_PAGINAS = 5;
    private static int RESULTADOS_POR_PAGINA = 5;
    private static int total;
    private static String[] origenes = {"Interno", "Web"};

    // Parámetros del filtrado
    private String desde = "";
    private String hasta = "";
    private String email = "";
    private int origen = -1;
    private String noLeidas;
    private String leidas;
    private String aceptadas;
    private String rechazadas;
    private String consulta;

    private Logger log = Logger.getLogger(ListaPeticiones.class);

    @Override
    public String execute() {

        String retorno = null;
        EntityManager em = null;

        try {

            em = emfBasket.createEntityManager(); // checked
            Query q = null;

            // Si no entramos utilizando la paginación, borramos los parámetros de la sesión
            if (pagina == -1) {
                session.remove("email");
                session.remove("origen");
                session.remove("noLeidas");
                session.remove("leidas");
                session.remove("aceptadas");
                session.remove("rechazadas");
                pagina = 1;
            }

            // Si estamos viendo resultados de búsqueda, recuperamos los parámetros
            if (session.get("email") != null) {
                email = (String)session.get("email");
            }
            if (session.get("origen") != null) {
                origen = (Integer)session.get("origen");
            }
            if (session.get("noLeidas") != null) {
                noLeidas = (String)session.get("noLeidas");
            }
            if (session.get("leidas") != null) {
                leidas = (String)session.get("leidas");
            }
            if (session.get("aceptadas") != null) {
                aceptadas = (String)session.get("aceptadas");
            }
            if (session.get("rechazadas") != null) {
                rechazadas = (String)session.get("rechazadas");
            }

            // Creamos la cadena de la consulta
            consulta = " where true";
            if (!email.equalsIgnoreCase("")) {
                consulta += " and lower(email) like '%" + email.toLowerCase() + "%'";
                session.put("email", email);
            }
            if (origen!=-1) {
                consulta += " and origen=" + origen;
                session.put("origen", origen);
            }
            List<String> estado = new ArrayList();
            if ((noLeidas != null) && (noLeidas.equalsIgnoreCase("on"))) {
                estado.add("0");
                session.put("noLeidas", "on");
            } else {
                session.put("noLeidas", "off");
            }
            if ((leidas != null) && (leidas.equalsIgnoreCase("on"))) {
                estado.add("1");
                session.put("leidas", "on");
            } else {
                session.put("leidas", "off");
            }
            if ((aceptadas != null) && (aceptadas.equalsIgnoreCase("on"))) {
                estado.add("2");
                session.put("aceptadas", "on");
            } else {
                session.put("aceptadas", "off");
            }
            if ((rechazadas != null) && (rechazadas.equalsIgnoreCase("on"))) {
                estado.add("3");
                session.put("rechazadas", "on");
            } else {
                session.put("rechazadas", "off");
            }
            if (!estado.isEmpty()) {
                String strEstado = "";
                for (String sEstado : estado) {
                    strEstado += sEstado + ",";
                }
                strEstado = "(" + strEstado.substring(0,strEstado.length()-1) + ")";
                consulta += " and estado in " + strEstado;
            }

            // Sacamos el número de resultados totales y ejecutamos la consulta
            q = em.createNativeQuery("select count(*) as paginas from central.invitacion_peticion" + consulta);
            total = ((java.math.BigInteger)q.getSingleResult()).intValue();
            q = em.createNativeQuery("select * from central.invitacion_peticion" + consulta, InvitacionPeticion.class);

            // Comprobamos si hay que mostrar todos los resultados o sólo los de una página concreta
            if (pagina==0) {
                paginas = total;
                primeraPagina = 1;
                ultimaPagina = 1;
            } else {
                paginas = total/RESULTADOS_POR_PAGINA;
                if ((total%RESULTADOS_POR_PAGINA)>0) {
                    paginas++;
                }
                primeraPagina = pagina-2;
                if (primeraPagina<1) {
                    primeraPagina = 1;
                }
                if (paginas>MAXIMO_PAGINAS) {
                    ultimaPagina = MAXIMO_PAGINAS;
                } else {
                    ultimaPagina = paginas;
                }
                q.setFirstResult((pagina-1)*RESULTADOS_POR_PAGINA);
                q.setMaxResults(RESULTADOS_POR_PAGINA);
            }

            // Sacamos los datos de la consulta
            datos = (List<InvitacionPeticion>)q.getResultList();
            retorno = SUCCESS;
        } catch (Exception e) {
            log.error("[execute]: ", e);
            retorno = ERROR;
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    public List<InvitacionPeticion> getDatos() {
        return datos;
    }

    public void setDatos(List<InvitacionPeticion> resultadoBusqueda) {
        this.datos = resultadoBusqueda;
    }

    public String getDesde() {
        return desde;
    }

    public void setDesde(String desde) {
        this.desde = desde;
    }

    public String getHasta() {
        return hasta;
    }

    public void setHasta(String hasta) {
        this.hasta = hasta;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getOrigen() {
        return origen;
    }

    public void setOrigen(int origen) {
        this.origen = origen;
    }

    public String getNoLeidas() {
        return noLeidas;
    }

    public void setNoLeidas(String noLeidas) {
        this.noLeidas = noLeidas;
    }

    public String getLeidas() {
        return leidas;
    }

    public void setLeidas(String leidas) {
        this.leidas = leidas;
    }
  
    public String getAceptadas() {
        return aceptadas;
    }

    public void setAceptadas(String aceptadas) {
        this.aceptadas = aceptadas;
    }

    public String getRechazadas() {
        return rechazadas;
    }

    public void setRechazadas(String rechazadas) {
        this.rechazadas = rechazadas;
    }

    public int getPagina() {
        return pagina;
    }

    public void setPagina(int pagina) {
        this.pagina = pagina;
    }

    public int getPaginas() {
        return paginas;
    }

    public void setPaginas(int paginas) {
        this.paginas = paginas;
    }

    public int getPrimeraPagina() {
        return primeraPagina;
    }

    public void setPrimeraPagina(int primeraPagina) {
        this.primeraPagina = primeraPagina;
    }

    public int getUltimaPagina() {
        return ultimaPagina;
    }

    public void setUltimaPagina(int ultimaPagina) {
        this.ultimaPagina = ultimaPagina;
    }

    public String[] getOrigenes() {
        return origenes;
    }

    public int getTotal() {
        return total;
    }

    public String getConsulta() {
        return consulta;
    }

}